package DesignPatterns.Singleton;

/**
 * 单例模式-双检索单例模式
 *  可以通过加锁的方式解决,但是带来的效率的降低（获取对象是枷锁）
 * @author yangjicong
 * @date 2022/7/9
 */
public class Singleton3 {
    private static Singleton3 INSTANCE;

    private Singleton3(){ }

    public static  Singleton3 getInstance(){
        //第一次判断是有必要的，如果进来不为空，下面直接不执行了，
        if (INSTANCE == null) {
            //双重检查
            synchronized (Singleton3.class) {
                if (INSTANCE == null) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new Singleton3();
                }

            }
        }
        return INSTANCE;
    }

    /**
     * 线程安全,如下案例
     * @param args
     */
    public static void main(String[] args) {
        //不同对象的hashcode是不同的
        for (int i = 0; i < 100; i++) {


            //ThreadPool.execute(new Runnable() {
            //    @Override
            //    public void run() {
            //       System.out.println(Singleton2.getInstance().hashCode());
            //    }
            //});
            new Thread(()-> System.out.println(Singleton3.getInstance().hashCode())).start();
        }
    }

}
